package dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import jdbc.JDBCProperties;
import jdbc.SimpleConnectionPool;
import model.LinhaProjeto;
import model.LinhaUsuario;
import model.Projeto;

public class ProjetoDAO {
	
	private static ProjetoDAO instancia = null;
	private Connection connection;

	private ProjetoDAO() throws SQLException {
		//this.connection = ConnectionFactory.getConnection();
		SimpleConnectionPool pool = SimpleConnectionPool.getInstance(JDBCProperties.url, JDBCProperties.login, JDBCProperties.senha, JDBCProperties.driver, 30);
		this.connection = pool.getConnection();
		
//		PostgreSQLAccess p = new PostgreSQLAccess();
//		this.connection = p.getConnection();
		
	}
	
	public static ProjetoDAO getInstance() throws SQLException {
		if (instancia == null) {
			return new ProjetoDAO();
		}
		return instancia;
	}

	public void adiciona(Projeto projeto) throws SQLException {
		PreparedStatement stmt = (PreparedStatement) this.connection
				.prepareStatement("INSERT INTO "
						+ "projeto(nomeUnix,nomeCompleto,descricao,licenca,descricaoPublica,scm,status) VALUES (?,?,?,?,?,?,?)");

		stmt.setString(1, projeto.getNomeUnix());
		stmt.setString(2, projeto.getNomeCompleto());
		stmt.setString(3, projeto.getDescricao());
		stmt.setString(4, projeto.getLicenca());
		stmt.setString(5, projeto.getDescricaoPublica());
		stmt.setString(6, projeto.getScm());
		stmt.setString(7, projeto.getStatus());

		stmt.execute();
		stmt.close();
	}

	public List<Projeto> getProjetos() throws SQLException {
		PreparedStatement stmt = (PreparedStatement) this.connection
				.prepareStatement("SELECT * FROM projeto");
		ResultSet rs = stmt.executeQuery();
		List<Projeto> projetos = new ArrayList<Projeto>();
		while (rs.next()) {
			Projeto projeto = new Projeto();
			projeto.setNomeUnix(rs.getString("nomeUnix"));
			projeto.setNomeCompleto(rs.getString("nomeCompleto"));
			projeto.setDescricao(rs.getString("descricao"));
			projeto.setLicenca(rs.getString("licenca"));
			projeto.setDescricaoPublica(rs.getString("descricaoPublica"));
			projeto.setStatus(rs.getString("status"));
			projeto.setScm(rs.getString("scm"));
			projetos.add(projeto);
		}
		rs.close();
		stmt.close();
		return projetos;
	}

	public Projeto pesquisa(String nomeProjeto) throws SQLException {
		PreparedStatement stmt = (PreparedStatement) this.connection
				.prepareStatement("SELECT * FROM projeto WHERE nomeUnix = ?");
		stmt.setString(1, nomeProjeto);
		ResultSet rs = stmt.executeQuery();
		
		//recupera os usuarios dos projeto
		UsuarioProjetoDAO daoUP = UsuarioProjetoDAO.getInstance();
		List<LinhaUsuario> linhasUsuarios =  daoUP.listaLinhasUsuarios(nomeProjeto);

		Projeto projeto = null;
		while (rs.next()) {
			String nomeUnix = rs.getString("nomeUnix");
			String nomeCompleto = rs.getString("nomeCompleto");
			String descricao = rs.getString("descricao");
			String descricaoPublica = rs.getString("descricaoPublica");
			String status = rs.getString("status");
			String licenca = rs.getString("licenca");
			String scm = rs.getString("scm");
			//String demanda = rs.getString("demanda");
			projeto = new Projeto(nomeUnix,nomeCompleto,descricao,licenca,descricaoPublica,scm,status);
			//.setStatus(status);
			//projeto.setScm(scm);
			projeto.setLinhasUsuarios(linhasUsuarios);
		}
		rs.close();
		stmt.close();
		return projeto;
	}
	
	public List<Projeto> pesquisa() throws SQLException {
		PreparedStatement stmt = (PreparedStatement) this.connection
				.prepareStatement("SELECT * FROM projeto");
		ResultSet rs = stmt.executeQuery();
		
		Projeto projeto = null;
		List<Projeto> projetos = new ArrayList<Projeto>();
		UsuarioProjetoDAO daoUP = UsuarioProjetoDAO.getInstance();
		while (rs.next()) {
			String nomeUnix = rs.getString("nomeUnix");
			String nomeCompleto = rs.getString("nomeCompleto");
			String descricao = rs.getString("descricao");
			String descricaoPublica = rs.getString("descricaoPublica");
			String status = rs.getString("status");
			String licenca = rs.getString("licenca");
			String scm = rs.getString("scm");
			//String demanda = rs.getString("demanda");
			projeto = new Projeto(nomeUnix,nomeCompleto,descricao,licenca,descricaoPublica,scm,status);
			//.setStatus(status);
			//projeto.setScm(scm);
			
			//recupera os usuarios dos projeto
			List<LinhaUsuario> linhasUsuarios =  daoUP.listaLinhasUsuarios(nomeUnix);
			
			projeto.setLinhasUsuarios(linhasUsuarios);
			
			projetos.add(projeto);
		}
		rs.close();
		stmt.close();
		return projetos;
	}
	
	public List<Projeto> listaProjetos(String usuario) throws SQLException {

		PreparedStatement stmt = (PreparedStatement)this.connection.prepareStatement(
				"SELECT p.nomeUnix, p.nomeCompleto, p.descricao, up.tipo " +
				"FROM projeto p, usuarioProjeto up " +
				"WHERE up.usuario=? AND p.nomeUnix=up.nomeUnix AND up.pertence=?");

//		PreparedStatement stmt = (PreparedStatement)this.connection
//		.prepareStatement("SELECT nomeUnix, tipo FROM usuarioProjeto WHERE usuario = ? AND pertence = ?");
		stmt.setString(1,usuario);
		//usuarios que realmente pertencem ao projeto = true
		stmt.setBoolean(2,true);
		ResultSet rs = stmt.executeQuery();
		List<Projeto> projetos = new ArrayList<Projeto>();
		while (rs.next()) {
			Projeto p = new Projeto();
			LinhaUsuario lu = new LinhaUsuario();
			
			String nomeUnix = rs.getString("p.nomeUnix");
			String nomeCompleto = rs.getString("p.nomeCompleto");
			String descricao = rs.getString("p.descricao");
			String tipo = rs.getString("up.tipo");
			boolean pertence = true;
			
//			ProjetoDAO daoP = ProjetoDAO.getInstance();
//			lp.setProjeto(daoP.pesquisa(nomeUnix));
			p.setNomeUnix(nomeUnix);
			p.setNomeCompleto(nomeCompleto);
			p.setDescricao(descricao);
			
			lu.setUsuario(usuario);
			lu.setTipo(tipo);
			lu.setPertence(pertence);
			
			List<LinhaUsuario> llu = new ArrayList<LinhaUsuario>();
			llu.add(lu);
			p.setLinhasUsuarios(llu);
			
			projetos.add(p);;
		}
		rs.close();
		stmt.close();
		return projetos;
	}
	
	public void altera(String nomeProjeto, String dado, String novoDado) throws SQLException {
		PreparedStatement stmt = (PreparedStatement) connection
				.prepareStatement("update projeto set " + dado + " = ? where nomeUnix = ?");
		stmt.setString(1,novoDado);
		stmt.setString(2,nomeProjeto);
		stmt.execute();
		stmt.close();
	}

	public void altera(Projeto projeto) throws SQLException {
		PreparedStatement stmt = (PreparedStatement) connection
				.prepareStatement("update projeto set nomeCompleto=?, descricao=?, descricaoPublica=?, status=? where nomeUnix=?");
		stmt.setString(1,projeto.getNomeCompleto());
		stmt.setString(2,projeto.getDescricao());
		stmt.setString(3,projeto.getDescricaoPublica());
		stmt.setString(4,projeto.getStatus());
		stmt.setString(5,projeto.getNomeUnix());
		stmt.execute();
		stmt.close();
	}

	public void remove(String nomeProjeto) throws SQLException {
		PreparedStatement stmt = (PreparedStatement) connection
				.prepareStatement("delete from projeto where nomeUnix=?");
		stmt.setString(1,nomeProjeto);
		stmt.execute();
		stmt.close();
	}
}